/*
 * Copyright 2005-2013 finalist.cn. All rights reserved.
 * Support: http://www.finalist.cn
 * License: http://www.finalist.cn/license
 */
package com.finalist.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.finalist.Filter;
import com.finalist.Page;
import com.finalist.Pageable;
import com.finalist.entity.Admin;
import com.finalist.entity.Member;
import com.finalist.entity.Order;
import com.finalist.entity.Order.OrderStatus;
import com.finalist.entity.Order.PaymentStatus;
import com.finalist.entity.Order.ShippingStatus;
import com.finalist.entity.Payment;
import com.finalist.entity.Refunds;
import com.finalist.entity.Returns;

/**
 * Service - 订单
 * 
 * @author Finalist IT Group
 * @version 3.0
 */
public interface OrderService extends BaseService<Order, Long>
{

    /**
     * 根据订单编号查找订单
     * 
     * @param sn
     *            订单编号(忽略大小写)
     * @return 若不存在则返回null
     */
    Order findBySn(String sn);

    /**
     * 查找订单
     * 
     * @param member
     *            会员
     * @param count
     *            数量
     * @param filters
     *            筛选
     * @param orders
     *            排序
     * @return 订单
     */
    List<Order> findList(Member member, Integer count, List<Filter> filters, List<com.finalist.Order> orders);

    /**
     * 查找订单分页
     * 
     * @param member
     *            会员
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPage(Member member, Pageable pageable);

    /**
     * 查找订单分页
     * 
     * @param member
     *            会员
     * @param pageable
     *            分页信息
     * @param statue
     *             订单状态 ，状态 0-全部状态 1-等待付款 2-等待发货 3-等待收货 4-已完成订单 5-已取消
     * @return 订单分页
     */
    Page<Order> findPage(Member member, Integer statue, Pageable pageable);

    /**
     * 按照订单状态查找订单分页
     * 
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPage(Member member, PaymentStatus paymentStatus, Pageable pageable);

    /**
     * 根据订单号查找订单分页
     * 
     * @param member
     *            会员
     * @param sn
     *            订单号
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByOrderSn(Member member, String sn, Pageable pageable);

    /**
     * 查找订单分页
     * 
     * @param orderStatus
     *            订单状态
     * @param paymentStatus
     *            支付状态
     * @param shippingStatus
     *            配送状态
     * @param hasExpired
     *            是否已过期
     * @param pageable
     *            分页信息
     * @return 商品分页
     */
    Page<Order> findPage(OrderStatus orderStatus, String productName, PaymentStatus paymentStatus, ShippingStatus shippingStatus, Boolean hasExpired, Long adminId, Pageable pageable);

    /**
     * 查询订单数量
     * 
     * @param orderStatus
     *            订单状态
     * @param paymentStatus
     *            支付状态
     * @param shippingStatus
     *            配送状态
     * @param hasExpired
     *            是否已过期
     * @return 订单数量
     */
    Long count(OrderStatus orderStatus, PaymentStatus paymentStatus, ShippingStatus shippingStatus, Boolean hasExpired);

    /**
     * 查询等待支付订单数量
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Long waitingPaymentCount(Member member);

    /**
     * 查询所有订单的数量
     * 
     * @param member
     *            会员
     * @return 所有订单的数量
     */
    Long allOrderCount(Member member);

    /**
     * 查询等待发货订单数量
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long waitingShippingCount(Member member);

    /**
     * 获取销售额
     * 
     * @param beginDate
     *            起始日期
     * @param endDate
     *            结束日期
     * @return 销售额
     */
    BigDecimal getSalesAmount(Date beginDate, Date endDate);

    /**
     * 获取销售量
     * 
     * @param beginDate
     *            起始日期
     * @param endDate
     *            结束日期
     * @return 销售量
     */
    Integer getSalesVolume(Date beginDate, Date endDate);


    /**
     * 更新订单
     * 
     * @param order
     *            订单
     * @param operator
     *            操作员
     */
    void update(Order order, Admin operator);

    /**
     * 订单确认
     * 
     * @param order
     *            订单
     * @param operator
     *            操作员
     */
    void confirm(Order order, Admin operator);

    /**
     * 订单完成
     * 
     * @param order
     *            订单
     * @param operator
     *            操作员
     */
    void complete(Order order, Admin operator);

    /**
     * 订单取消
     * 
     * @param order
     *            订单
     * @param operator
     *            操作员
     */
    void cancel(Order order, Admin operator);

    /**
     * 订单支付
     * 
     * @param order
     *            订单
     * @param payment
     *            收款单
     * @param operator
     *            操作员
     */
    void payment(Order order, Payment payment, Admin operator);

    /**
     * 订单退款
     * 
     * @param order
     *            订单
     * @param refunds
     *            退款单
     * @param operator
     *            操作员
     */
    void refunds(Order order, Refunds refunds, Admin operator);

    /**
     * 查询等待支付订单
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Page<Order> findPageBywaitingPayment(Member member, Pageable pageable);

    /**
     * 查询等待发货订单
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Page<Order> findPageBywaitingShipping(Member member, Pageable pageable);


    /**
     * 订单退货
     * 
     * @param order
     *            订单
     * @param returns
     *            退货单
     * @param operator
     *            操作员
     */
    void returns(Order order, Returns returns, Admin operator);

    /**
     * 根据订单状态查询订单信息
     * 
     * @param paymentStatus
     *            订单状态
     * @param isSelectedPhone
     *            是否选择号码，true-选号 false-查所有
     * @return
     */
    List<Order> findByPaymentStatus(PaymentStatus paymentStatus, boolean isSelectedPhone);

    /**
     * 根据订单号或商品名称、商品编号查找订单分页
     * 
     * @param member
     *            会员
     * @param keyWord 
     *           订单号或商品名称、商品编号
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByKeyWord(Member member, String keyWord, Pageable pageable);

    /**
     * 获取会员的消费总金额（包括已支付、部分支付、部分退款且订单状态不是取消状态的订单）
     * 
     * @param member
     *            会员
     * @return 若不存在则返回0.00
     */
    BigDecimal getTotalConsumeMoney(Member member);

    /**
     * 查询等待收货订单数量
     * 
     * @param member
     *            会员
     * @return 等待收货订单数量
     */
    Long waitingReceiveOrderCount(Member member);

    /**
     * 查询已完成订单数量
     * 
     * @param member
     *            会员
     * @return 等待已完成订单数量
     */
    Long finishOrderCount(Member member);

    /**
     * 查询已取消订单数量（不包过括过期订单）
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long expiredOrderCount(Member member);
    
    /**
     * 查询已过期订单数量
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long cancelOrderCount(Member member);

    /**
     * 保存或修改订单信息
     * @param order
     */
    void merge(Order order);
    
    /**
     * 
     * @param member
     * @param status 1 : 未支付 2：已支付 3：进行中 4：已完成 5：已关闭
     * @return
     */
    List<Order>  findPage(Member member, Integer status);
    
    /**
     * 对于未支付超过45分钟的订单进行处理
     */
    void updateOrderNopaid();
    
    
}